﻿using ImageProcessor;
using ImageProcessor.Imaging;
using ImageProcessor.Imaging.Formats;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Yz.Core.Extensions
{
    public static class ImageProcessorExtension
    {
        /// <summary>
        ///     保存图片并生成缩略图（自动旋转图片）
        /// </summary>
        /// <param name="fileStream">文件流</param>
        /// <param name="savePath">图片地址</param>
        /// <param name="fileThPath">缩略图地址</param>
        public static void SaveImage(this Stream fileStream, string savePath, string fileThPath, int width = 32, int height = 32)
        {
            using (var imageFactory = new ImageFactory())
            {
                // 加载，自动旋转，保存图像。
                imageFactory.Load(fileStream)
                    //.Format(format)
                    //.AutoRotate()
                    .Save(savePath);

                //对获取的imageFactory对象进行对应的操作

                #region 图片旋转

                if (imageFactory.ExifPropertyItems.ContainsKey(274))
                {
                    var orien = imageFactory.ExifPropertyItems[274].Value[0];
                    var angel = 0;
                    //ExceptionLog.WriteLog("图片角度代码：" + orien);
                    if (6 == orien)
                        angel = 90;
                    else if (3 == orien)
                        angel = 180;
                    else if (8 == orien) angel = 270;
                    if (angel > 0) imageFactory.Rotate(angel).Save(savePath);
                }

                #endregion 图片旋转

                #region 制作缩略图

                var relay = new ResizeLayer(new Size(width, height), ResizeMode.Crop);
                imageFactory.Resize(relay).Save(fileThPath);

                #endregion 制作缩略图
            }
        }

        /// <summary>
        ///     裁剪图片并生成缩略图（自动旋转图片）
        /// </summary>
        /// <param name="fileStream">文件流</param>
        /// <param name="savePath">图片地址</param>
        /// <param name="fileThPath">缩略图地址</param>
        /// <param name="rectangle">裁剪图片规格</param>
        public static void SaveImage(this Stream fileStream, string savePath, string fileThPath, Rectangle rectangle)
        {
            using (var imageFactory = new ImageFactory())
            {
                // 加载，裁剪图片，保存图像。
                imageFactory.Load(fileStream)
                    //.Constrain(new Size(1920, 1920))
                    .Save(savePath);

                //对获取的imageFactory对象进行对应的操作

                #region 图片旋转

                if (imageFactory.ExifPropertyItems.ContainsKey(274))
                {
                    var orien = imageFactory.ExifPropertyItems[274].Value[0];
                    var angel = 0;
                    //ExceptionLog.WriteLog("图片角度代码：" + orien);
                    if (6 == orien)
                        angel = 90;
                    else if (3 == orien)
                        angel = 180;
                    else if (8 == orien) angel = 270;
                    if (angel > 0) imageFactory.Rotate(angel).Save(savePath);
                }

                #endregion 图片旋转

                //裁剪图片
                imageFactory.Crop(rectangle).Save(savePath);

                #region 制作缩略图

                var relay = new ResizeLayer(new Size(160, 160), ResizeMode.Crop);
                imageFactory.Resize(relay).Save(fileThPath);

                #endregion 制作缩略图
            }
        }

        /// <summary>
        ///     裁剪图片并重新生成缩略图
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="thPath"></param>
        /// <param name="rectangle"></param>
        public static void CutImage(this byte[] imgBytes, string filePath, string thPath, Rectangle rectangle)
        {
            using (var imageFactory = new ImageFactory())
            {
                // 加载，裁剪图片，保存图像。
                imageFactory.Load(imgBytes);
                //裁剪图片
                imageFactory.Crop(rectangle).Save(filePath);

                #region 制作缩略图

                var relay = new ResizeLayer(new Size(160, 160), ResizeMode.Crop);
                imageFactory.Resize(relay).Save(thPath);

                #endregion 制作缩略图
            }
        }

        /// <summary>
        ///     旋转图片
        /// </summary>
        /// <param name="imgBytes"></param>
        /// <param name="filePath"></param>
        /// <param name="thPath"></param>
        public static void RotateImage(this byte[] imgBytes, string filePath, string thPath)
        {
            using (var imageFactory = new ImageFactory())
            {
                // 加载，裁剪图片，保存图像。
                imageFactory.Load(imgBytes);

                //对获取的imageFactory对象进行对应的操作

                #region 图片旋转

                if (imageFactory.ExifPropertyItems.ContainsKey(274))
                {
                    var orien = imageFactory.ExifPropertyItems[274].Value[0];
                    var angel = 0;
                    //ExceptionLog.WriteLog("图片角度代码：" + orien);
                    if (6 == orien)
                        angel = 90;
                    else if (3 == orien)
                        angel = 180;
                    else if (8 == orien) angel = 270;
                    if (angel > 0) imageFactory.Rotate(angel).Save(filePath);

                    #region 制作缩略图

                    var relay = new ResizeLayer(new Size(160, 160), ResizeMode.Crop);
                    imageFactory.Resize(relay).Save(thPath);

                    #endregion 制作缩略图
                }

                #endregion 图片旋转
            }
        }

        /// <summary>
        ///     获取图片缩略图
        /// </summary>
        /// <param name="fileStream">图片</param>
        /// <param name="fileThPath">缩略图存放地址</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="rectangle">裁剪图片规格</param>
        public static void GetThumb(this Stream fileStream, string fileThPath, int width, int height, Rectangle rectangle)
        {
            using (var imageFactory = new ImageFactory())
            {
                //制作缩略图
                var relay = new ResizeLayer(new Size(width, height), ResizeMode.Crop);
                // 加载，转格式，缩放，保存。
                imageFactory.Load(fileStream)
                    .Crop(rectangle)
                    .Resize(relay)
                    .Save(fileThPath);
            }
        }

        public static void GetThumb(this Stream fileStream, string fileThPath, int width, int height)
        {
            using (var imageFactory = new ImageFactory())
            {
                //制作缩略图
                var relay = new ResizeLayer(new Size(width, height), ResizeMode.Crop);
                // 加载，转格式，缩放，保存。
                imageFactory.Load(fileStream)
                    .Resize(relay)
                    .Save(fileThPath);
            }
        }

        public static void GetThumb(this string filePath, string fileThPath, int width, int height)
        {
            using (var imageFactory = new ImageFactory())
            {
                //制作缩略图
                var relay = new ResizeLayer(new Size(width, height), ResizeMode.Crop);
                // 加载，转格式，缩放，保存。
                imageFactory.Load(filePath)
                    .Resize(relay)
                    .Save(fileThPath);
            }
        }

        public static Image CompressPicture(this Image img, int height, int width, int quality)
        {
            Image timage = null;
            if (img == null) return timage;
            var ms = new MemoryStream();
            img.Save(ms, ImageFormat.Png);
            var photoBytes = ms.ToArray();
            // 检测格式
            //  new JpegFormat { Quality = quality };
            ISupportedImageFormat format = new PngFormat { Quality = quality };
            var size = new Size(height, width);
            using (var inStream = new MemoryStream(photoBytes))
            {
                using (var outStream = new MemoryStream())
                {
                    // 使用重载初始化ImageFactory以保留EXIF元数据。
                    using (var imageFactory = new ImageFactory(true))
                    {
                        // 加载，调整大小，设置格式和质量并保存图像。
                        imageFactory.Load(inStream)
                            .Resize(size)
                            .Format(format)
                            .Save(outStream);
                        //对获取的imageFactory对象进行对应的操作
                    }

                    //对获取的数据流进行操作
                    timage = Image.FromStream(outStream);
                }
            }

            return timage;
        }
    }
}
